/**
 * @description: 日期时间格式化函数
 * @param  { Array } args :形参数组，生效的最多为前两个参数
 * 1个参数情况：
 *      1.1 参数为格式，则默认格式化当前时间
 *      1.2 参数为时间戳或字符串时间，则使用默认格式去格式化化给定的 时间戳或字符串时间
 * 2个参数情况：
 * 第一个参数表示格式化的日期，可以是时间戳或字符串时间
 * 第二个参数表示格式
 */
const format = function (...args) {
    try {
        // 参数解构
        const [a, b] = args
        // 默认值
        let dt = new Date(), //默认当前时间
            ft = 'YYYY-MM-DD HH:mm:ss' // 默认格式
        //如果参数只传入了一个的情况，我们认为用户用户传入的是格式，需要格式化的是当前时间
        if (args.length == 1) {
            if (isNaN(new Date(a).valueOf())) {
                ft = a
            } else {
                dt = new Date(typeof a == 'string' && a.includes('-') ? a.replace(/-/g, '/') : a)
            }
        } else if (args.length >= 2) {
            dt = new Date(typeof a == 'string' && a.includes('-') ? a.replace(/-/g, '/') : a)
            ft = b
        }
        const map = {
            Y: String(dt.getFullYear()), //4位数 年份
            M: String(dt.getMonth() + 1).padStart(2, 0), // 2位数 月份
            D: String(dt.getDate()).padStart(2, 0), // 2位数 日期
            H: String(dt.getHours()).padStart(2, 0), // 2位数 时
            m: String(dt.getMinutes()).padStart(2, 0), // 2位数 分
            s: String(dt.getSeconds()).padStart(2, 0), //2位数 秒
            S: String(dt.getMilliseconds()).padStart(3, 0), // 3位数 毫秒
            Q: Math.floor((dt.getMonth() + 3) / 3) + '' //季度
        }
        return ft.replace(/\[([^\]]+)]|y{1,4}|Y{1,4}|M{1,2}|d{1,2}|D{1,2}|h{1,2}|H{1,2}|m{1,2}|s{1,2}|q|t|S{1,3}/g, match => {
            // 匹配中的首字符
            let k = match[0]
            // 匹配到的字符串长度
            let len = match.length
            switch (k) {
                case 'y':
                case 'Y':
                    return match.replace(new RegExp('((' + k + ')+)', 'g'), a => map.Y.substr(4 - a.length))
                case 'M':
                    return len == 1 ? Number(map.M) : map.M
                case 'D':
                case 'd':
                    return len == 1 ? Number(map.D) : map.D
                case 'H':
                case 'h':
                    return len == 1 ? Number(map.H) : map.H
                case 'm':
                    return len == 1 ? Number(map.m) : map.m
                case 's':
                    return len == 1 ? Number(map.s) : map.s
                case 'S':
                    return match.replace(new RegExp('((' + k + ')+)', 'g'), a => map.S.substr(3 - a.length))
                case '[':
                    return match.replace(/\[|\]/g, '')
                case 'q':
                    return map.Q
                default:
                    return match
            }
        })
    } catch (e) {
        return new Date('') // Invalid Date
    }
}


// 使用默认格式格式化当前日期
console.log(format())

// 指定格式来格式化当前日期
console.log(format('yyyy-MM-dd'))


// 使用默认格式来格式化指定日期
console.log(format('2021/1/1'))

// 指定格式来格式化指定日期
console.log(format('2021/1/1', 'yy-MM-dd hh:mm:ss S'))

// 模板处理特殊字符
format('2021/1/1', 'yyyy-MM-dd [yyyy]')
// => "2021-01-01 yyyy"
console.log(format('2021/1/1', 'yyyy-MM-dd [yyyy]'))

format('2021/1/1', '2021/1/1是属于第q季度')
// => "2021/1/1是属于第1季度"

console.log(format('当前时间是属于第q季度'))
